package com.weimob.cloud.api.crm.req;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

/**
 * 微盟调整积分请求参数
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WeimobCrmPointAdjustReq implements Serializable {

    /**
     * 该笔积分操作的请求流水号，用于操作幂等。可自定义输入，与 requestType 搭配使用，需保证全局唯一。
     */
    @JsonProperty("requestId")
    private String requestId;

    /**
     * 请求类型
     * 枚举值
     * 0-其他；
     * 1-微商城订单请求；
     * 2-提现申请单请求；
     * 3-预充订单请求；
     * 4-预充调整订单请求；
     * 5-开放平台请求；
     * 6-智慧酒店订单请求；
     * 7-智慧旅游订单请求；
     * 8-发券宝活动请求；
     * 9-老旺铺迁移订单；
     * 10-到店请求；
     * 11-公共营销请求；
     * 12-营销活动奖品服务请求；
     * 13-签到有礼服务请求；
     * 14-解绑微信会员卡请求；
     * 15-删除会员请求；
     * 16-智营销请求；
     * 17-智营销流程自动化插件；
     * 18-会员营销发奖服务请求；
     * 19-知识付费；
     * 20-智慧美业；
     * 21-OneCrm；
     * 22-售后退还；
     * 23-交易中台扣减积分
     */
    @JsonProperty("requestType")
    private Integer requestType;

    /**
     * 调整用户对象
     */
    @JsonProperty("adjustPointInfoList")
    private List<AdjustPointInfoDTO> adjustPointInfoList;

    /**
     * 变更积分数值。需要调整的积分额度，正整数（不能有小数点），取值范围为大于等于 1，小于等于 999999999。
     */
    @JsonProperty("changePoint")
    private Integer changePoint;

    /**
     * 积分调整类型
     * 枚举值
     * 1-调增；2-调减
     */
    @JsonProperty("adjustType")
    private Integer adjustType;

    /**
     * 变更原因
     */
    @JsonProperty("changeReason")
    private String changeReason;

    /**
     * 当前操作人 wid
     */
    @JsonProperty("operatorWid")
    private String operatorWid;

    /**
     * 操作回退积分的组织 ID
     */
    @JsonProperty("operateStoreVid")
    private Integer operateStoreVid;

    /**
     * 积分变动来源的组织 ID
     */
    @JsonProperty("sourceVid")
    private Integer sourceVid;

    /**
     * 该笔积分操作的外部交易流水号，用于锁定的唯一 ID。可自定义输入，与 outTransType 搭配使用，需保证 outTransType 类型内唯一。
     */
    @JsonProperty("outTransNo")
    private String outTransNo;

    /**
     * 外部交易类型
     * 枚举值
     * 0-其他；1-微商城订单；2-智慧酒店订单；3-到店订单；4-知识付费
     */
    @JsonProperty("outTransType")
    private String outTransType;

    /**
     * 变更类型
     * 枚举值
     * 100-积分发放；
     * 101-积分消耗；
     * 102-售后；
     * 103-分销；
     * 104-商家调整；
     * 104_1-调正；
     * 104_2-调负；
     * 105-营销活动；
     * 105_1-积分商城；
     * 105_2-荐客有礼；
     * 105_3-其他；
     * 105_4-任务卡；
     * 105_5-营销活动回收；
     * 106-互动游戏；
     * 106_207-砸金蛋；
     * 106_226-扭蛋机；
     * 106_222-大转盘；
     * 106_210-刮刮卡；
     * 106_212-摇摇乐；
     * 106_213-摇一摇；
     * 106_214-消消乐；
     * 106_344-签到摇奖机；
     * 106_215-粉丝集结令；
     * 106_216-荐客有礼；
     * 106_341-红包也疯狂；
     * 106_340-拆礼盒；
     * 106_337-微助力；
     * 106_224-砍价；
     * 106_322-微留言；
     * 106_225-微投票；
     * 106_220-带参二维码；
     * 106_221-一码多用；
     * 106_217-礼品卡；
     * 106_425-高级表单；
     * 106_165946-挖宝达人；
     * 106_165544-包粽子；
     * 106_165646-集卡；
     * 106_165575-语音红包；
     * 106_165604-整蛊大师；
     * 106_165921-默契大考验；
     * 106_165937-我是预言家；
     * 106_165635-步数星球；
     * 106_165636-答题吃鸡；
     * 106_165875-小小果园；
     * 106_165551-测评；
     * 106_165932-睡神大作战；
     * 106_165876-脸战；
     * 106_165876-全民运动会；
     * 106_165600-任务卡；
     * 107-开放平台；
     * 108-清零规则；
     * 109-其他；
     * 110-客户营销；
     * 110_1-开卡有礼；
     * 110_2-消费有礼；
     * 110_3-充值有礼；
     * 110_4-升级有礼；
     * 110_5-生日有礼；
     * 110_6-节日有礼；
     * 110_7-签到有礼；
     * 110_10-首单有礼；
     * 110_11-收藏有礼；
     * 110_12-关注有礼；
     * 111-自动化营销；
     * 112-企微助手；
     * 112_1-裂变；
     * 112_2-直接发放
     */
    @JsonProperty("changeType")
    private String changeType;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class AdjustPointInfoDTO implements Serializable {

        /**
         * 目标客户所属的组织 ID
         */
        @JsonProperty("vid")
        private Long vid;

        /**
         * 目标客户编号
         */
        @JsonProperty("wid")
        private Long wid;

        /**
         * 目标客户所采用的积分方案 ID
         */
        @JsonProperty("pointPlanId")
        private Integer pointPlanId;
    }
}
